package hu.szte.ovrt.mzst.operations;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import hu.szte.ovrt.mzst.exceptions.BadOperandException;
import hu.szte.ovrt.visitors.ExpressionVisitor;

public class Copy extends TwoOperandOperation {

	public Copy(String firstOperand, String secondOperand) {
		super(firstOperand, secondOperand);
	}

	public static void copy(File src, File dest) throws IOException {

		if (src.isDirectory()) {

			// if directory not exists, create it
			if (!dest.exists()) {
				dest.mkdir();
				System.out.println("Directory copied from " + src + "  to "
						+ dest);
			}

			// list all the directory contents
			String files[] = src.list();

			for (String file : files) {
				// construct the src and dest file structure
				File srcFile = new File(src, file);
				File destFile = new File(dest, file);
				// recursive copy
				copy(srcFile, destFile);
			}

		} else {
			// if file, then copy it
			// Use bytes stream to support all file types
			InputStream in = new FileInputStream(src);
			OutputStream out = new FileOutputStream(dest);

			byte[] buffer = new byte[1024];

			int length;
			// copy the file content in bytes
			while ((length = in.read(buffer)) > 0) {
				out.write(buffer, 0, length);
			}

			in.close();
			out.close();
			System.out.println("File copied from " + src + " to " + dest);
		}
	}

	@Override
	public void execute() throws BadOperandException {

		System.out.println("COPY " + firstOperand + " TO " + secondOperand);

		try {
			copy(new File(firstOperand), new File(secondOperand));
		} catch (FileNotFoundException e) {
			throw new BadOperandException("Fajl nem talalhato!");
		} catch (IOException e) {
			throw new BadOperandException("Masolasi hiba tortent");
		}

	}

	@Override
	public void accept(ExpressionVisitor visitor) {
		visitor.visit(this);
	}
	
	public String toString() {
		return "masol " + firstOperand + " " + secondOperand;
	}
}
